package com.wsj.util.page;

import java.io.Serializable;   
import java.util.List;   
  
import org.hibernate.Criteria;   
import org.hibernate.HibernateException;   
import org.hibernate.Session;   
import org.hibernate.criterion.DetachedCriteria;   
import org.hibernate.criterion.Projections;   
import org.springframework.orm.hibernate3.HibernateCallback;   
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
  
import com.wsj.util.page.PaginationSupport;
  
public abstract class AbstractManager extends HibernateDaoSupport {   
  
    private boolean cacheQueries = false;   
  
    private String queryCacheRegion;   
  
    public void setCacheQueries(boolean cacheQueries) {   
        this.cacheQueries = cacheQueries;   
    }   
  
    public void setQueryCacheRegion(String queryCacheRegion) {   
        this.queryCacheRegion = queryCacheRegion;   
    }   
  
    public void save(final Object entity) {   
        getHibernateTemplate().save(entity);   
    }   
  
    public void persist(final Object entity) {   
        getHibernateTemplate().save(entity);   
    }   
  
    public void update(final Object entity) {   
        getHibernateTemplate().update(entity);   
    }   
  
    public void delete(final Object entity) {   
        getHibernateTemplate().delete(entity);   
    }   
  
    public Object load(final Class entity, final Serializable id) {   
        return getHibernateTemplate().load(entity, id);   
    }   
  
    public Object get(final Class entity, final Serializable id) {   
        return getHibernateTemplate().get(entity, id);   
    }   
  
    public List findAll(final Class entity) {   
        return getHibernateTemplate().find("from " + entity.getName());   
    }   
  
    public List findByNamedQuery(final String namedQuery) {   
        return getHibernateTemplate().findByNamedQuery(namedQuery);   
    }   
  
    public List findByNamedQuery(final String query, final Object parameter) {   
        return getHibernateTemplate().findByNamedQuery(query, parameter);   
    }   
  
    public List findByNamedQuery(final String query, final Object[] parameters) {   
        return getHibernateTemplate().findByNamedQuery(query, parameters);   
    }   
  
    public List find(final String query) {   
        return getHibernateTemplate().find(query);   
    }   
  
    public List find(final String query, final Object parameter) {   
        return getHibernateTemplate().find(query, parameter);   
    }   
  
    public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria) {   
        return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, 0);   
    }   
  
    public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int startIndex) {   
        return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, startIndex);   
    }   
  
    public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int pageSize,   
            final int startIndex) {   
        return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() {   
            public Object doInHibernate(Session session) throws HibernateException {   
                Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
                int totalCount=0;
                Object obj = criteria.setProjection(Projections.rowCount()).uniqueResult();
                if(obj!=null)
                totalCount = ((Integer)obj).intValue();   
                criteria.setProjection(null); 
                List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); 
                PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex);   
                return ps;   
            }   
        }, true);   
    }   
  
    public List findAllByCriteria(final DetachedCriteria detachedCriteria) {   
        return (List) getHibernateTemplate().execute(new HibernateCallback() {   
            public Object doInHibernate(Session session) throws HibernateException {   
                Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
                return criteria.list();   
            }   
        }, true);   
    }   
  
    public int getCountByCriteria(final DetachedCriteria detachedCriteria) {   
        Integer count = (Integer) getHibernateTemplate().execute(new HibernateCallback() {   
            public Object doInHibernate(Session session) throws HibernateException {   
                Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
                return criteria.setProjection(Projections.rowCount()).uniqueResult();   
            }   
        }, true);   
        return count.intValue();   
    }

	public boolean isCacheQueries() {
		return cacheQueries;
	}

	public String getQueryCacheRegion() {
		return queryCacheRegion;
	}   
}   
